From 692ed4f994886be2abbef8c6cc99f73560147d2c Mon Sep 17 00:00:00 2001 From: =?utf8?q?Timm=20B=C3=A4der?= Date: Sun, 2 Dec 2018 14:17:18 +0100 Subject: [PATCH] gl renderer: Refactor render op builder --- gsk/gl/gskglrenderops.c | 69 ++++++++++++++++++---------------- gsk/gl/gskglrenderopsprivate.h | 46 ++++++++++++----------- 2 files changed, 60 insertions(+), 55 deletions(-) diff --git a/gsk/gl/gskglrenderops.c b/gsk/gl/gskglrenderops.c index 28926f4ece..ace761790c 100644 --- a/gsk/gl/gskglrenderops.c +++ b/gsk/gl/gskglrenderops.c @@ -157,6 +157,7 @@ ops_set_program (RenderOpBuilder *builder, static const graphene_matrix_t empty_matrix; static const graphene_rect_t empty_rect; RenderOp op; + ProgramState *program_state; if (builder->current_program == program) return; @@ -166,50 +167,54 @@ ops_set_program (RenderOpBuilder *builder, g_array_append_val (builder->render_ops, op); builder->current_program = program; + program_state = &builder->program_state[program->index]; + /* If the projection is not yet set for this program, we use the current one. */ - if (memcmp (&empty_matrix, &builder->program_state[program->index].projection, sizeof (graphene_matrix_t)) == 0 || - memcmp (&builder->current_projection, &builder->program_state[program->index].projection, sizeof (graphene_matrix_t)) != 0) + if (memcmp (&empty_matrix, &program_state->projection, sizeof (graphene_matrix_t)) == 0 || + memcmp (&builder->current_projection, &program_state->projection, sizeof (graphene_matrix_t)) != 0) { op.op = OP_CHANGE_PROJECTION; op.projection = builder->current_projection; g_array_append_val (builder->render_ops, op); - builder->program_state[program->index].projection = builder->current_projection; + program_state->projection = builder->current_projection; } - if (memcmp (&empty_matrix, &builder->program_state[program->index].modelview, sizeof (graphene_matrix_t)) == 0 || - memcmp (builder->current_modelview, &builder->program_state[program->index].modelview, sizeof (graphene_matrix_t)) != 0) + if (memcmp (&empty_matrix, &program_state->modelview, sizeof (graphene_matrix_t)) == 0 || + memcmp (builder->current_modelview, &program_state->modelview, sizeof (graphene_matrix_t)) != 0) { op.op = OP_CHANGE_MODELVIEW; op.modelview = *builder->current_modelview; g_array_append_val (builder->render_ops, op); - builder->program_state[program->index].modelview = *builder->current_modelview; + program_state->modelview = *builder->current_modelview; } - if (memcmp (&empty_rect, &builder->program_state[program->index].viewport, sizeof (graphene_rect_t)) == 0 || - memcmp (&builder->current_viewport, &builder->program_state[program->index].viewport, sizeof (graphene_rect_t)) != 0) + if (memcmp (&empty_rect, &program_state->viewport, sizeof (graphene_rect_t)) == 0 || + memcmp (&builder->current_viewport, &program_state->viewport, sizeof (graphene_rect_t)) != 0) { op.op = OP_CHANGE_VIEWPORT; op.viewport = builder->current_viewport; g_array_append_val (builder->render_ops, op); - builder->program_state[program->index].viewport = builder->current_viewport; + program_state->viewport = builder->current_viewport; } - if (memcmp (&empty_clip, &builder->program_state[program->index].clip, sizeof (GskRoundedRect)) == 0 || - memcmp (&builder->current_clip, &builder->program_state[program->index].clip, sizeof (GskRoundedRect)) != 0) + if (memcmp (&empty_clip, &program_state->clip, sizeof (GskRoundedRect)) == 0 || + memcmp (&builder->current_clip, &program_state->clip, sizeof (GskRoundedRect)) != 0) { op.op = OP_CHANGE_CLIP; op.clip = builder->current_clip; g_array_append_val (builder->render_ops, op); - builder->program_state[program->index].clip = builder->current_clip; + program_state->clip = builder->current_clip; } - if (builder->program_state[program->index].opacity != builder->current_opacity) + if (program_state->opacity != builder->current_opacity) { op.op = OP_CHANGE_OPACITY; op.opacity = builder->current_opacity; g_array_append_val (builder->render_ops, op); - builder->program_state[program->index].opacity = builder->current_opacity; + program_state->opacity = builder->current_opacity; } + + builder->current_program_state = &builder->program_state[program->index]; } GskRoundedRect @@ -238,7 +243,7 @@ ops_set_clip (RenderOpBuilder *builder, } if (builder->current_program != NULL) - builder->program_state[builder->current_program->index].clip = *clip; + builder->current_program_state->clip = *clip; prev_clip = builder->current_clip; builder->current_clip = *clip; @@ -253,7 +258,7 @@ ops_set_modelview (RenderOpBuilder *builder, RenderOp op; if (builder->current_program && - memcmp (&builder->program_state[builder->current_program->index].modelview, modelview, + memcmp (&builder->current_program_state->modelview, modelview, sizeof (graphene_matrix_t)) == 0) return; @@ -279,7 +284,7 @@ ops_set_modelview (RenderOpBuilder *builder, } if (builder->current_program != NULL) - builder->program_state[builder->current_program->index].modelview = *modelview; + builder->current_program_state->modelview = *modelview; } void @@ -356,7 +361,7 @@ ops_set_projection (RenderOpBuilder *builder, } if (builder->current_program != NULL) - builder->program_state[builder->current_program->index].projection = *projection; + builder->current_program_state->projection = *projection; prev_mv = builder->current_projection; builder->current_projection = *projection; @@ -376,7 +381,7 @@ ops_set_viewport (RenderOpBuilder *builder, g_array_append_val (builder->render_ops, op); if (builder->current_program != NULL) - builder->program_state[builder->current_program->index].viewport = *viewport; + builder->current_program_state->viewport = *viewport; prev_viewport = builder->current_viewport; builder->current_viewport = *viewport; @@ -455,7 +460,7 @@ ops_set_opacity (RenderOpBuilder *builder, builder->current_opacity = opacity; if (builder->current_program != NULL) - builder->program_state[builder->current_program->index].opacity = opacity; + builder->current_program_state->opacity = opacity; return prev_opacity; } @@ -466,10 +471,10 @@ ops_set_color (RenderOpBuilder *builder, { RenderOp op; - if (gdk_rgba_equal (color, &builder->program_state[builder->current_program->index].color)) + if (gdk_rgba_equal (color, &builder->current_program_state->color)) return; - builder->program_state[builder->current_program->index].color = *color; + builder->current_program_state->color = *color; op.op = OP_CHANGE_COLOR; op.color = *color; @@ -484,15 +489,15 @@ ops_set_color_matrix (RenderOpBuilder *builder, RenderOp op; if (memcmp (matrix, - &builder->program_state[builder->current_program->index].color_matrix.matrix, + &builder->current_program_state->color_matrix.matrix, sizeof (graphene_matrix_t)) == 0 && memcmp (offset, - &builder->program_state[builder->current_program->index].color_matrix.offset, + &builder->current_program_state->color_matrix.offset, sizeof (graphene_vec4_t)) == 0) return; - builder->program_state[builder->current_program->index].color_matrix.matrix = *matrix; - builder->program_state[builder->current_program->index].color_matrix.offset = *offset; + builder->current_program_state->color_matrix.matrix = *matrix; + builder->current_program_state->color_matrix.offset = *offset; op.op = OP_CHANGE_COLOR_MATRIX; op.color_matrix.matrix = *matrix; @@ -507,18 +512,16 @@ ops_set_border (RenderOpBuilder *builder, { RenderOp op; - /* TODO: Assert that current_program == border program? */ - - if (memcmp (&builder->program_state[builder->current_program->index].border.widths, + if (memcmp (&builder->current_program_state->border.widths, widths, sizeof (float) * 4) == 0 && - memcmp (&builder->program_state[builder->current_program->index].border.outline, + memcmp (&builder->current_program_state->border.outline, outline, sizeof (GskRoundedRect)) == 0) return; memcpy (&builder->program_state[builder->current_program->index].border.widths, widths, sizeof (float) * 4); - builder->program_state[builder->current_program->index].border.outline = *outline; + builder->current_program_state->border.outline = *outline; op.op = OP_CHANGE_BORDER; op.border.widths[0] = widths[0]; @@ -537,11 +540,11 @@ ops_set_border_color (RenderOpBuilder *builder, op.op = OP_CHANGE_BORDER_COLOR; rgba_to_float (color, op.border.color); - if (memcmp (&op.border.color, &builder->program_state[builder->current_program->index].border.color, + if (memcmp (&op.border.color, &builder->current_program_state->border.color, sizeof (float) * 4) == 0) return; - rgba_to_float (color, builder->program_state[builder->current_program->index].border.color); + rgba_to_float (color, builder->current_program_state->border.color); g_array_append_val (builder->render_ops, op); } diff --git a/gsk/gl/gskglrenderopsprivate.h b/gsk/gl/gskglrenderopsprivate.h index 38b66744e4..88303f039e 100644 --- a/gsk/gl/gskglrenderopsprivate.h +++ b/gsk/gl/gskglrenderopsprivate.h @@ -218,30 +218,32 @@ typedef struct typedef struct { - /* Per-Program State */ - struct { - GskRoundedRect clip; - graphene_matrix_t modelview; - graphene_matrix_t projection; - int source_texture; - graphene_rect_t viewport; - float opacity; - /* Per-program state */ - union { - GdkRGBA color; - struct { - graphene_matrix_t matrix; - graphene_vec4_t offset; - } color_matrix; - struct { - float widths[4]; - float color[4]; - GskRoundedRect outline; - } border; - }; - } program_state[GL_N_PROGRAMS]; + GskRoundedRect clip; + graphene_matrix_t modelview; + graphene_matrix_t projection; + int source_texture; + graphene_rect_t viewport; + float opacity; + /* Per-program state */ + union { + GdkRGBA color; + struct { + graphene_matrix_t matrix; + graphene_vec4_t offset; + } color_matrix; + struct { + float widths[4]; + float color[4]; + GskRoundedRect outline; + } border; + }; +} ProgramState; +typedef struct +{ + ProgramState program_state[GL_N_PROGRAMS]; /* Current global state */ + ProgramState *current_program_state; const Program *current_program; int current_render_target; int current_texture; -- 2.30.2